package ar.com.jsejtman.common.service.localization;

/**
 * Interfaz que debe implementar todo localizador de servicios. La idea es que este localizador
 * permita obtener una única instancia de un servicio a nivel de sistema para que pueda brindar la
 * funcionalidad requerida a diferentes solicitudes.
 * 
 * @author jsejtman
 */
public interface IServiceLocator {

	/**
	 * Obtiene un servicio del registro de servicios.
	 * 
	 * @param <Service> Tipo de servicio a instanciar.
	 * @param serviceId El identificador del servicio a obtener.
	 * @param serviceInterface La clase a la que debe castear el servicio obtenido.
	 * @return Servicio obtenido.
	 */
	<Service> Service getService(final String serviceId, final Class<Service> serviceInterface);

	/**
	 * Método para obtener un servicio que tiene una única implementación en el registro. Es
	 * importante destacar que sólo UN punto de servicio debe implementar el mismo.
	 * 
	 * @param <Service> Tipo de servicio a instanciar.
	 * @param serviceInterface La clase a la que debe castear el servicio obtenido.
	 * @return Servicio obtenido.
	 */
	<Service> Service getService(final Class<Service> serviceInterface);

}
